#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    // 文本类型
    ui->label_2->setTextFormat(Qt::PlainText);
    ui->label_2->setText("#<b>普通文本</b>");
    // 富文本支持html标签
    ui->label_3->setTextFormat(Qt::RichText);
    ui->label_3->setText("<b>富文本</b>");
    // markdown文本支持其自己的文本方式
    ui->label_4->setTextFormat(Qt::MarkdownText);
    ui->label_4->setText("# markdown");

    // label显示图片
    QPixmap pixmap(":/mn.jpg");
    ui->label_pictory->setPixmap(pixmap);

    QRect rect = this->geometry();
    qDebug() << rect;
    ui->label_pictory->setGeometry(360,20,rect.width()*0.25,rect.height()*0.33);
    ui->label_pictory->setScaledContents(true);// 自动拉伸

    // label文本对齐方式
    ui->label_align->setText("这是一段测试文本");
    ui->label_align->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
    //ui->label_align->setAlignment(Qt::AlignRight | Qt::AlignTop);
    //ui->label_align->setAlignment(Qt::AlignLeft | Qt::AlignBottom);

    // label自动换行、缩进
    // Qt缩进特殊，是换行之后的行也会缩进，而不是只是首行缩进
    ui->label_newline_retract->setText("这是一个测试自动换行的控件这是一个测试自动换行的控件这是一个测试自动换行的控件这是一个测试自动换行的控件这是一个测试自动换行的控件");
    ui->label_newline_retract->setWordWrap(true);
    ui->label_newline_retract->setIndent(50);

    // label边距,四个方向全都会设置
    ui->label_margin->setText("这是一个测试边距的文本");
    ui->label_margin->setMargin(50);

    // 绑定 label 和 radiobutton 的伙伴关系
    // 在label中， 文本中可以设置快捷键，使用&加上键，就可以设置，然后alt+这个键就可以触发
    ui->label_quick->setBuddy(ui->radioButton);

    // LCD Number专门显示数字的控件，类似于老式计算器
    ui->lcdNumber->display("10");
    // 设置定时器，使lcdNumber每秒钟减一，减到零
    timer = new QTimer(this);
    // 关联 timeout 信号和槽函数
    connect(timer,&QTimer::timeout,this,&Widget::handle);
    // 启动定时器，参数是发送信号的周期
    timer->start(1000);

    //通过循环来控制lcdNumber,但是这是不行的，因为这是构造函数，先构造完才会显示
//    ui->lcdNumber_2->display("10");
//    int value = ui->lcdNumber_2->intValue();
//    while(true)
//    {
//        std::this_thread::sleep_for(std::chrono::seconds(1));
//        if(value <= 0)
//            break;
//        else
//        {
//            ui->lcdNumber_2->display(--value);
//        }
//    }
//    按创建一个新的线程来执行这段代码呢？
//    Qt 中界面有一个专门的线程去负责维护更新的(主线程)(main 函数所在的线程)
//    对于 GUI 来说,内部包含了很多的隐藏状态,Qt 为了保证修改界面的过程中,线程安全是不会受到影响的,Qt 禁止了其他线程直接修改界面.
//    ui->lcdNumber->display(value); 形如这种操作,就是在修改界面~~
//    因此 Qt 为了确保线程安全,直接要求所有的对界面的修改操作,必须在主线程中完成!!
//    对于 Qt 的槽函数来说,默认情况下,槽函数都是由主线程调用的,在槽函数中修改界面是没有任何问题的!!
//    所以下面这段代码也是不行的
//    std::thread t([this](){
//        this->ui->lcdNumber_2->display("10");
//        int value = ui->lcdNumber_2->intValue();
//        while(true)
//        {
//            std::this_thread::sleep_for(std::chrono::seconds(1));
//            if(value <= 0)
//                break;
//            else
//            {
//                ui->lcdNumber_2->display(--value);
//            }
//        }
//    });

    // 进度条
    timer2 = new QTimer(this);

    connect(timer2,&QTimer::timeout,this,&Widget::handle_bar);

    timer2->start(100);

}

Widget::~Widget()
{
    delete ui;
}

// 重写父类虚函数，来改变事件发生的效果
void Widget::resizeEvent(QResizeEvent *event)
{
    qDebug() << event->size();
    ui->label_pictory->setGeometry(360,20,event->size().width()*0.25,event->size().width()*0.25);
}


// checkbox复选框测试
void Widget::on_pushButton_clicked()
{
    QString result = "今天的安排是：";

    if(ui->checkBox_study->isChecked())
        result += ui->checkBox_study->text() + " ";
    if(ui->checkBox_game->isChecked())
        result += ui->checkBox_game->text() + " ";
    if(ui->checkBox_sleep->isChecked())
        result += ui->checkBox_sleep->text() + " ";

    ui->label->setText(result);
}

// 定时器触发槽函数
void Widget::handle()
{
    int value = ui->lcdNumber->intValue();
    if(value <= 0)
    {
        timer->stop();
        return;
    }
    else
    {
        ui->lcdNumber->display(value - 1);
    }
}

void Widget::handle_bar()
{
    int value = ui->progressBar->value();
    if(value >= 100)
    {
        timer->stop();
        return;
    }
    else
    {
        ui->progressBar->setValue(value + 1);
    }
}

// 日历槽函数
void Widget::on_calendarWidget_selectionChanged()
{
    QDate date = ui->calendarWidget->selectedDate();

    ui->label_date->setText(date.toString());
}
